#include<iostream>

using namespace std ;

const int maxn = 11 ;

/**
 * 问题的思路就是：
 * 要求行列和斜线上都不能重复 ， 那么就两次循环 ，双指针的第一个指针从第一列开始 ，第二个指针依次枚举他后面的列
 * 这样显然保证了皇后不在同一列 ， 然而由于path中存放的是全排列 ， 所哟一行也不会重复
 * 所以只用判断下对角线是否重复即可
 */
int n ;
int path[maxn] ;    //path[i]在这个问题中是指第 i 列中的这一列中皇后放在哪一行
bool st[maxn] ;
int count = 0 ;


void perm(int x) {
    if(x == n) {
        bool flag = true ; //当前这一个排列假设可行
        for(int i = 0 ; i < n ; i++) {
            for (int j = i + 1; j < n ; ++j) {
                if(abs(i - j) == abs(path[i] - path[j])) {
                    flag = false ;
                    break ;
                }
            }
        }
        if(flag) {  //相当于判断这条序列的正确性
            count ++;
        }
        return ;
    }
    for (int i = 1; i <= n ; ++i) {
        if(!st[i]) {
            path[x] = i ;
            st[i] = true ;
            perm(x + 1);
            st[i] = false ;
        }
    }
}

int main() {

    scanf("%d" , &n );
    perm(0);
    printf("%d", count );
    return 0 ;
}